package com.koala.swb.i18n.resources;

import java.io.Serializable;
import java.util.Locale;
import java.util.Map;

import com.koala.excepcion.Excepcion;

/**
 * 
 * @author cerokool32
 * @category Lenguage
 */
@SuppressWarnings("unused")
public class Estante implements Serializable{

	/**
	 * 
	 */
	//private static final long serialVersionUID = -8057477215206410897L;
	private static final long serialVersionUID = 1L;

	//mapa de idiomas soportados.
	private Locale[] regiones;
	
	//identificadores de la aplicación y del tomo de diccionario
	private String app;
	private String tomo;
	
	//mapa de diccionarios adquiridos a partir de los idiomas soportados.
	private Map<Locale, Diccionario> libreria;
	
	//diccionario seleccionado por defecto
	private Locale select;
	
	/**
	 * Constructor por defecto, destinado a la creación de nuevos diccionarios.
	 * @param app Nombre de la aplicación.
	 */
	public Estante(String app) {
		this.app=app;
	}
	
	/**
	 * Inicializa una estanteria de diccionarios para la aplicación que lo solicita.
	 * @param app Aplicación que solicita.
	 * @param regiones Mapa de idiomas, donde el campo key identifica el tomo requerido y el campo Locale identifica la región.
	 * @throws Excepcion en caso de que no se encuentren los diccionarios seleccionados, asociados a la aplicación.
	 */
	public Estante(String app, String tomo, Locale[] regiones) throws Excepcion {
		
		this.regiones=regiones;
		this.app=app;
		this.tomo=tomo;
		
		
		for(Locale key : regiones)	
			libreria.put(key, new Diccionario(key, app, tomo));
			
	}
	
	/**
	 * Selecciona un diccionario por defecto.
	 * @param region Identificador de la región.
	 */
	public void SetDiccionarioActual(Locale region){
		
		this.select=region;
		
	}
	
	/**
	 * Crea un nuevo diccionario para la aplicación y lo agrega al estante, ademas selecciona este como el diccionario por defecto.
	 * @param tomo Numero de tomo para el nuevo diccionario.
	 * @param region Region para la cual se crea el tomo.
	 * @param definiciones Mapa de definiciones para el nuevo diccionario.
	 * @throws Excepcion Error en caso de que no se pueda crear el archivo o que las definiciones no puedan ser ingresadas al diccionario.
	 */
	public void CrearDiccionario(String tomo, Locale region, Map<String, String> definiciones) throws Excepcion{
		
		Diccionario nuevoDic=new Diccionario(app, tomo);
		
		nuevoDic.CrearDiccionario(region, definiciones);
		
		libreria.put(region, nuevoDic);
		
		select=region;
		
	}
	
	/**
	 * Agrega un mapa de definiciones al diccionario seleccionado marcado como default.
	 * @param definiciones mapa de definiciones a ingresar.
	 * @throws Excepcion Error en caso de que no se puedan ingresar las definiciones al diccionario.
	 */
	public void SetDefiniciones(Map<String, String> definiciones) throws Excepcion{
		
		Diccionario dic=libreria.get(select);
		
		for(String key: definiciones.keySet())
			dic.SetDefinicion(key, definiciones.get(key));
		
		libreria.put(select, dic);
	}
	
	/**
	 * Obtiene una definición del diccionario marcado como default.
	 * @param identificador Identificador de la definición.
	 * @return Definición.
	 */
	public String GetDefinicion(String identificador){
		
		return libreria.get(select).GetDefinicion(identificador);
		
	}
}
